local rtl = {}
local ksuper = {} -- 作为查找父类的key

-- 定义一个类, super是父类, 为nil表示没有父类
function rtl.class(super)
	local klass = {}  -- 这就是代表类的table
	klass[ksuper] = super -- 把父类table保存起来
	klass.__index = klass -- __index设为自己 

	local _class_metatable = rtl._class_metatable -- 这是类的元表,所有类都设置同一个元表
	if not _class_metatable then
		_class_metatable = {
			__index = function(t, k)
				-- 取得类的父类
				local super = rawget(t, ksuper)
				if super then
					-- 然后继续访问k,如果找不到还会触发__index,一直往上追溯
					return super[k]
				else
					return nil
				end
			end,

			__call = function(cls, ...)
				-- 创建类的对象, cls就是类
				local obj = {}
				-- 将cls设为obj的元素, 找不到obj的字段时,就会触发klass.__index
				-- 而__index指向klass自己，所以相当于在klass上访问字段
				setmetatable(obj, cls)

				-- 约定_init为类的构造函数,所以这里会调用构造函数
				local _init = cls._init
				if _init then
					_init(obj, ...)
				end

				-- 最后返回这个对象
				return obj
			end
		}
		rtl._class_metatable = _class_metatable
	end

	-- 设置类的元表
	setmetatable(klass, _class_metatable)

	-- 最后返回类
	return klass
end

return rtl

